package thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * pool-1-thread-1--ExecutorsDemo线程开始执行
 * pool-1-thread-2--ExecutorsDemo线程开始执行
 * pool-1-thread-3--ExecutorsDemo线程开始执行
 * pool-1-thread-4--ExecutorsDemo线程开始执行
 * pool-1-thread-5--ExecutorsDemo线程开始执行
 * pool-1-thread-6--ExecutorsDemo线程开始执行
 * pool-1-thread-7--ExecutorsDemo线程开始执行
 * pool-1-thread-8--ExecutorsDemo线程开始执行
 * pool-1-thread-9--ExecutorsDemo线程开始执行
 * pool-1-thread-10--ExecutorsDemo线程开始执行
 * pool-1-thread-2--ExecutorsDemo线程执行完成
 * pool-1-thread-3--ExecutorsDemo线程执行完成
 * pool-1-thread-4--ExecutorsDemo线程执行完成
 * pool-1-thread-1--ExecutorsDemo线程执行完成
 * pool-1-thread-10--ExecutorsDemo线程执行完成
 * pool-1-thread-9--ExecutorsDemo线程执行完成
 * pool-1-thread-8--ExecutorsDemo线程执行完成
 * pool-1-thread-7--ExecutorsDemo线程执行完成
 * pool-1-thread-6--ExecutorsDemo线程执行完成
 * pool-1-thread-5--ExecutorsDemo线程执行完成
 *
 * 使用线程池来创建线程
 * 1.使用concurrent包下面的Executors的静态方法来创建线程池
 * 2.创建Runnable的实例作为参数去execute执行即可
 * 3.最后记得shutdown线程池
 * 注意：ExecutorService还有submit方法，可以接受Callable和Runnable的实例，并得到Future获取线程返回值
 */
public class ExecutorsDemo implements Runnable{

    public static void main(String[] args) {
//        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(10); //创建固定大小的线程池，定时执行
//        ExecutorService service = Executors.newFixedThreadPool(15); //创建一个固定大小的线程池
//        ExecutorService service = Executors.newSingleThreadExecutor(); //创建一个线程大小为1的线程池
        ExecutorService service = Executors.newCachedThreadPool(); //创建一个线程大小可变的线程池，会根据提交到线程池的数量来创建线程池大小
        ExecutorsDemo command = new ExecutorsDemo();
        for (int i=0; i<10; i++) {
            service.execute(command);
        }
        service.shutdown();
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "--ExecutorsDemo线程开始执行");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "--ExecutorsDemo线程执行完成");
    }
}
